終於來到鐵人賽的最後一天,今天來講講什麼是TDD吧!寫測試!我們這裡提的「測試」,指的是 TDD(Test-Driven Development)
,中文翻譯做「測試驅動開發
」。很多人會把重點放在 Test 上,但事實上 TDD 是一種 Development(開發)的方法,並不是一種「測試方法」!
測試驅動開發(TDD)是一種軟體開發方法,其核心思想是在實現功能代碼之前,首先編寫測試代碼,簡單來說寫的不是測試,是規格!TDD 遵循以下基本流程:
編寫測試
:首先,開發人員寫測試用例,這些測試用例描述了代碼應該具備的功能或行為。
運行測試
:運行測試,確保它們全部失敗。這是因為代碼尚未實現所需的功能。
實現功能
:開發人員現在開始實現代碼以使測試通過。
重複
:重複步驟 1 到 3,直到所有測試通過並且功能完全實現。
重構
:在確保所有測試通過後,可以進行代碼重構以改進代碼的質量和性能。
介紹了 TDD 那也講講常見的測試框架 RSpec 它的目標是讓測試代碼更容易閱讀和理解,RSpec 的語法旨在將測試用例讀起來像是自然語言,這使得開發人員和非開發人員更容易理解測試的目的和期望行為,RSpec 主要包含以下幾個核心:
Describe Blocks
:
RSpec 使用 describe 來組織測試,它通常用於描述被測試的類、模組或功能:
describe Article do
# 測試碼將在這裡
end
Context Blocks
:
上下文用於建立測試的上下文,通常用來設置測試的前提條件:
describe Article do
context "when a new article is created" do
let(:article) { Article.new }
# 測試碼將在這裡
end
end
Examples
:
例子是實際的測試用例,通常由 it 關鍵字
引入。它們描述了一個具體的行為並包括斷言(expectations
),用於驗證該行為的正確性
it "is not valid without a title" do
article.title = nil
expect(article).to_not be_valid
end
Expectations
:
RSpec 提供了一組斷言方法,如 expect,用於確保測試的期望結果。你可以使用 expect 將一個實際值(例如一個變數或表達式的結果)與一個期望值進行比較,以確保它們相等或滿足某種條件
接下來稍微實際操作一下吧~
$ rails new BlogApp
# Gemfile
group :development, :test do
gem 'rspec-rails'
end
執行安裝指令
$ bundle install
接下來,初始化 RSpec
$ rails generate rspec:install
建一個 Article 模型,具有標題(title)和內容(content):
rails generate model Article title:string content:text
spec/models 目錄下,建一個新的測試文件 article_spec.rb,並加上以下內容確保 Article 模型的驗證工作正常
# spec/models/article_spec.rb
require 'rails_helper'
RSpec.describe Article, type: :model do
it "is valid with a title and content" do
article = Article.new(
title: "Sample Article",
content: "This is the content of the article."
)
expect(article).to be_valid
end
it "is not valid without a title" do
article = Article.new(content: "This is the content of the article.")
expect(article).to_not be_valid
end
it "is not valid without content" do
article = Article.new(title: "Sample Article")
expect(article).to_not be_valid
end
end
Article 模型的測試指令
$ rspec spec/models/article_spec.rb
如果所有測試通過,應該會看到一個成功的結果
加入驗證確保標題和內容不為空
# app/models/article.rb
class Article < ApplicationRecord
validates :title, presence: true
validates :content, presence: true
end
再跑一次 Article 模型的測試,應該會看到所有測試通過!
$ rspec spec/models/article_spec.rb
至於 TDD 要如何熟悉呢? 一個字 practice
就是練,常常練、努力的練!
很開心鐵人賽在這邊告一個段落了,距離我成為四項鐵人又近了一點,完成了第一項也就是iT鐵人賽,接著除了增進自己工程師的技能樹之外,偶爾跑跑步、游一下泳和騎騎自行車來繼續鍛鍊體能和工程師技能,成為真正的四項鐵人囉!
先來許願期許自己明年的目標:
1.明年可以完成泳渡日月潭
2.明年的鐵人賽可以寫個跟資料庫相關的深入探討或是使用心得教學之類的文章
我們明年見!